window.load =function(){
	//随着代码的增加，函数嵌套，各级调用变得越来越复杂，传递一个对象的引用将变得越来越不明智，而this机制提供了一个更加优雅
	//this和函数在哪里定义没有半毛钱关系
	var person1= {
	    name: "Kyle"
	};
	function identify(context) {
	    return context.name.toUpperCase();
	}
	identify( person1); // KYLE
	function identify() {
	    return this.name.toUpperCase();
	}
	identify.call( person1); // KYLE
	//this错解 this引用function本身
	function fn(num) {
	    console.log( "fn: " + num );
	    // count用于记录fn的被调用次数
	    this.count++;
	}
	fn.count = 0;
	var i;
	for (i=0; i<10; i++) {
	    if (i > 5) {
	        fn( i );
	    }
	}
	//this机制包括四种规则
	//1.默认绑定全局变量
	function fn(){
		console.log(this.a)
	}
	var a =2;
	fn();
	//2.隐式绑定
	//隐式调用的意思是，函数调用时拥有一个上下文对象，就好像这个函数属于该对象的一样
	function fn (){
		console.log(this.a)
	}
	var obj ={
		a:2,
		fn:fn
	}
	obj.fn()//2
	//隐式解绑，重新定义
	function fn() {
	    console.log( this.a );
	}
	var obj = {
	    a: 2,
	    fn: fn
	};
	var bar = obj.fn; // 函数引用传递，这个只是传递函数，没有传递方法。
	var a = "全局"; // 定义全局变量
	bar(); // "全局"
	//3.显示绑定
	//bind（） apply（）call（）接受的第一个参数，就是上下文对象并将其赋给this
	function fn(){
		console.log(this.a);
	}
	var obj ={a:2};
	fn.call(obj)//2
	var a =10;
	fn.call(null)//10
	//4.new对象绑定
	function fn(a){
		this.a =a;
	}
	var bar = new fn(2);
	console.log(bar.a);//2
	//如果一个函数中有this，但是它没有被上一级的对象所调用，那么this指向的就是window
	//如果一个函数中有this，这个函数有被上一级的对象所调用，那么this指向的就是上一级的对象,也只指向他的上一级
	//
};
